package com.hc.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author hs
 * @date 2021/05/04
 */
@Configuration
public class DruidConfig {

    /**
     * 和配置文件绑定
     * @return 。
     */
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }


    /**
     * 配置 Druid 监控管理后台的Servlet；内置 Servlet 容器时没有web.xml文件，所以使用 Spring Boot 的注册 Servlet 方式
     * @return ServletRegistrationBean
     */
    @Bean
    public ServletRegistrationBean statViewServlet(){
        //后面是固定写法 第二个参数是访问路径，就是什么路径能够进去，一般是写这个
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        //配置后台登录的账号密码
        HashMap<String, String> map = new HashMap<String, String>();

        //增加配置 设置账号名和密码，map集合的key的底层源码固定了的，不能写其他的
        map.put("loginUsername","admin");
        map.put("loginPassword","123456");

        //设置允许谁能访问,如果value是空字符串就表示所有人都可以访问到我们的druid后台监控，一般写一个具体的人，写localhost就表本机可以访问
        map.put("allow","");

        //设置参数参数,它需要一个hashmap，我们就在上面创建一个
        bean.setInitParameters(map);
        return bean;
    }

    /**
     * 配置过滤器
     * @return
     */
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new WebStatFilter());
        //过滤哪些请求
        Map<String, String> initParameters = new HashMap<>();
        //这下面的key是查看源码得到的，后面的value是过滤的，这些请求不会被记录
        initParameters.put("exclusions","*.js,*.css,/druid/*");
        bean.setInitParameters(initParameters);
        return bean;
    }
}
